﻿using System;
using System.Collections.Generic;
using System.Text;
using Sinacor.Infra.Common.Exceptions;
using Sinacor.Infra.Service.ExceptionHandling;
using Sinacor.Infra.Service.Security.Services;
using System.ServiceModel;

namespace Sinacor.Servico.Bovespa.Cliente.Service.ServiceContract
{
    /// <summary>
    /// Interface de Tipo de Conta
    /// </summary>
    [ExceptionShielding]
    [ServiceContract(Namespace = "http://www.bovespa.com.br/Sinacor.Servico.Bovespa.Cliente.Service.ServiceContract", SessionMode = SessionMode.Allowed, Name = "ITipoConta")]
    public interface ITipoConta
    {
        #region Métodos
        /// <summary>
        /// Altera os dados de um tipo de conta de um determinado cliente
        /// </summary>
        /// <param name="request">Tipo Conta</param>
        [OperationLog]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.BusinessFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.ValidationFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.GeneralFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.InvalidSessionFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.LicensingFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.AccessIsDeniedFault))]
        [OperationContract(IsTerminating = false, IsInitiating = true, IsOneWay = false, AsyncPattern = false, Action = "AlterarTipoConta")]
        void AlterarTipoConta(DataContract.Request.TipoContaRequest request);

        /// <summary>
        /// Altera os dados de diversos tipos de conta de diversos clientes
        /// </summary>
        /// <param name="request">Lista de tipos de Conta</param>
        [OperationLog]
        [TransactionRequired]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.BusinessFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.ValidationFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.GeneralFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.InvalidSessionFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.LicensingFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.AccessIsDeniedFault))]
        [OperationContract(IsTerminating = false, IsInitiating = true, IsOneWay = false, AsyncPattern = false, Action = "AlterarTiposConta")]
        void AlterarTiposConta(List<DataContract.Request.TipoContaRequest> request);

        /// <summary>
        /// Consulta tipos de contas conforme o filtro informado
        /// </summary>
        /// <param name="request">Filtro de Tipo de Conta</param>
        /// <returns></returns>
        [OperationLog]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.BusinessFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.ValidationFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.GeneralFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.InvalidSessionFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.LicensingFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.AccessIsDeniedFault))]
        [OperationContract(IsTerminating = false, IsInitiating = true, IsOneWay = false, AsyncPattern = false, Action = "ConsultarTiposConta")]
        List<DataContract.Response.TipoContaResponse> ConsultarTiposConta(DataContract.Request.FiltroTipoContaRequest request);

        /// <summary>
        /// Exclui um tipo de conta de um determinado cliente
        /// </summary>
        /// <param name="request">Codigo do Cliente</param>
        [OperationLog]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.BusinessFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.ValidationFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.GeneralFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.InvalidSessionFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.LicensingFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.AccessIsDeniedFault))]
        [OperationContract(IsTerminating = false, IsInitiating = true, IsOneWay = false, AsyncPattern = false, Action = "ExcluirTipoConta")]
        void ExcluirTipoConta(DataContract.Request.FiltroCodigoClienteRequest request);

        /// <summary>
        /// Exclui diversos tipos de conta de diversos clientes
        /// </summary>
        /// <param name="request"></param>
        [OperationLog]
        [TransactionRequired]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.BusinessFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.ValidationFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.GeneralFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.InvalidSessionFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.LicensingFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.AccessIsDeniedFault))]
        [OperationContract(IsTerminating = false, IsInitiating = true, IsOneWay = false, AsyncPattern = false, Action = "ExcluirTiposConta")]
        void ExcluirTiposConta(List<DataContract.Request.FiltroCodigoClienteRequest> request);

        /// <summary>
        /// Inclui diversos tipo de conta para diversos cliente
        /// Altera os dados de diversos tipos de conta de diversos clientes
        /// Exclui diversos tipos de conta de diversos clientes
        /// </summary>
        /// <param name="listaInclusao">Lista de Inclusão</param>
        /// <param name="listaAlteracao">Lista de Alteração</param>
        /// <param name="listaExclusao">Lista de Exclusão</param>
        [OperationLog]
        [TransactionRequired]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.BusinessFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.ValidationFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.GeneralFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.InvalidSessionFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.LicensingFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.AccessIsDeniedFault))]
        [OperationContract(IsTerminating = false, IsInitiating = true, IsOneWay = false, AsyncPattern = false, Action = "ExecutarTransacoes")]
        void ExecutarTransacoes(List<DataContract.Request.TipoContaRequest> listaInclusao, List<DataContract.Request.TipoContaRequest> listaAlteracao, List<DataContract.Request.FiltroCodigoClienteRequest> listaExclusao);

        /// <summary>
        /// Inclui um tipo de conta para um determinado cliente
        /// </summary>
        /// <param name="request">Tipo de Conta</param>
        [OperationLog]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.BusinessFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.ValidationFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.GeneralFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.InvalidSessionFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.LicensingFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.AccessIsDeniedFault))]
        [OperationContract(IsTerminating = false, IsInitiating = true, IsOneWay = false, AsyncPattern = false, Action = "IncluirTipoConta")]
        void IncluirTipoConta(DataContract.Request.TipoContaRequest request);

        /// <summary>
        ///  Inclui diversos tipo de conta para diversos cliente
        /// </summary>
        /// <param name="request">Lista de Tipos de Conta</param>
        [OperationLog]
        [TransactionRequired]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.BusinessFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.ValidationFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.GeneralFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.InvalidSessionFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.LicensingFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.AccessIsDeniedFault))]
        [OperationContract(IsTerminating = false, IsInitiating = true, IsOneWay = false, AsyncPattern = false, Action = "IncluirTiposConta")]
        void IncluirTiposConta(List<DataContract.Request.TipoContaRequest> request);

        #endregion
    }
}
